import "@site/src/languages/highlight";
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

# 如何组织你的游戏工程

&emsp;&emsp;在游戏开发的世界中，项目管理和代码组织是非常关键的一环。本教程旨在介绍如何使用 Dora SSR 开源游戏引擎来组织和管理游戏项目工程目录。

## 1. 了解 Dora SSR 的项目管理机制

&emsp;&emsp;Dora SSR 引擎采用基于文件目录的方式来管理游戏项目。在这种结构中，任何包含名为 `init` 的文件的目录都会自动被识别为游戏工程的根目录。这个 `init` 文件的扩展名可以是 `.yue`、`.lua`、`.ts`、`.tsx`、`.tl` 或 `.wasm`。

## 2. 游戏工程目录的识别

&emsp;&emsp;当使用 Dora SSR 的 Web IDE 开发时，如果打开任何代码文件进行预览或编辑，并执行项目运行操作，IDE 将自动从当前打开文件的目录开始向上搜索，直到找到包含 `init` 文件的根目录。游戏的运行测试将从这个 `init` 文件启动。

## 3. 工程目录组织建议

&emsp;&emsp;为了更加标准化地组织自己的游戏工程，建议（并非强制要求）按以下方式组织游戏项目目录：

- **游戏项目根目录**
	- **Audio**：用于存放游戏音频资源。
	- **Data**：用于存放静态的游戏数据文件如Excel表格，脚本编写的配置表等。
	- **Font**：用于存放游戏的字库文件资源。
	- **Image**：用于存放游戏图片资源。
	- **Script**：存放脚本文件，如 Lua、YueScript 、 Teal 或是 TS 代码。
	- **Spine**：用于存放游戏动画资源。
	- **init.yue | lua | tl | ts | tsx | wasm**：项目启动文件，根据使用的脚本语言选择合适的扩展名。

&emsp;&emsp;这种结构不仅清晰，也便于管理和维护。

## 4. 代码模块的搜索路径

&emsp;&emsp;在编写 Lua、YueScript、Teal 和 TypeScript 代码时，如果需要导入外部模块，Dora SSR 引擎运行时和 Web IDE 将按以下顺序搜索代码模块：

1. **游戏项目根目录/Script**
2. **游戏项目根目录**
3. **引擎内置资源根目录/Script/Lib**
4. **引擎内置资源根目录/Script/Lib/Dora/zh-Hans**
5. **引擎内置资源根目录**

&emsp;&emsp;其中，对 **序号3** 的搜索路径的使用请确认已经了解了 Dora SSR 提供的开发辅助的功能库的使用，**序号4** 的搜索路径主要是用于给多种静态类型的脚本语言提供 Dora SSR 引擎接口的类型定义文件。请确保你的模块存放路径符合上述搜索逻辑，以便在项目中无缝使用。

#### 模块导入示例

```text
project/
├── init.lua
└── Script/
	 ├── moduleA.lua
	 └── moduleB.lua
```

<Tabs groupId="language-select">
<TabItem value="lua" label="Lua">

```lua title="init.lua"
-- 导入本地模块
local moduleA = require("moduleA") -- 使用了`序号1`的搜索路径: project/Script/moduleA.lua
local moduleB = require("Script.moduleB") -- 使用了`序号2`的搜索路径: project/Script/moduleB.lua

-- 导入引擎内置模块
local Utils = require("Utils") -- 使用了`序号3`的搜索路径: 引擎内置资源根目录/Script/Lib/Utils.lua
```

</TabItem>
<TabItem value="tl" label="Teal">

```tl title="init.tl"
-- 导入本地模块
local moduleA = require("moduleA") -- 使用了`序号1`的搜索路径: project/Script/moduleA.lua
local moduleB = require("Script.moduleB") -- 使用了`序号2`的搜索路径: project/Script/moduleB.lua

-- 导入引擎内置模块
local Utils = require("Utils") -- 使用了`序号3`的搜索路径: 引擎内置资源根目录/Script/Lib/Utils.lua
```

</TabItem>
<TabItem value="ts" label="TypeScript">

```ts title="init.ts"
// 导入本地模块
import moduleA from "moduleA"; // 使用了`序号1`的搜索路径: project/Script/moduleA.ts
import moduleB from "Script/moduleB"; // 使用了`序号2`的搜索路径: project/Script/moduleB.ts

// 导入引擎内置模块
import * as Utils from "Utils"; // 使用了`序号3`的搜索路径: 引擎内置资源根目录/Script/Lib/Utils.lua
```

</TabItem>
<TabItem value="yue" label="YueScript">

```yue title="init.yue"
-- 导入本地模块
import "moduleA" -- 使用了`序号1`的搜索路径: project/Script/moduleA.yue
import "Script.moduleB" -- 使用了`序号2`的搜索路径: project/Script/moduleB.yue

-- 导入引擎内置模块
local Utils = require("Utils") -- 使用了`序号3`的搜索路径: 引擎内置资源根目录/Script/Lib/Utils.lua
```

</TabItem>
</Tabs>

## 5. 最佳实践

- 保持代码和资源的组织清晰，有助于团队协作和项目维护。
- 利用 Dora SSR Web IDE 的代码检查的功能来即时看到代码模块导入生效的效果。
- 检查项目目录下是否存在正确命名的 `init` 文件，确保项目能被正确加载和运行。

&emsp;&emsp;通过遵循这些指南，你可以有效地管理和运行你的游戏项目，祝你利用 Dora SSR 引擎的强大功能，创作出引人入胜的游戏体验。

